﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


//int (*parr1[3])()     []优先级比*高，这在前头指针数组也有体现
//parr1 先和[]结合，说明parr1是数组，数组的内容是什么呢？是int(*)()类型的函数指针


//下面是一个转移表
//没用函数指针数组的写法如下

//int add(int a, int b)
//{
//	return a + b;
//}
//int sub(int a, int b)
//{
//	return a - b;
//}
//int mul(int a, int b)
//{
//	return a * b;
//}
//int div(int a, int b)
//{
//	return a / b;
//}
//int main()
//{
//	int x, y;
//	int input = 1;
//	int ret = 0;
//	do
//	{
//		printf("*************************\n");
//		printf("  1:add           2:sub  \n");
//          printf("  3:mul           4:div  \n");
//        printf("  0:exit                 \n");
//        printf("*************************\n");
//        printf("请选择：");
//            scanf("%d", &input);
//        switch (input)
//        {
//        case 1:
//            printf("输⼊操作数：");
//                scanf("%d %d", &x, &y);
//            ret = add(x, y);
//            printf("ret = %d\n", ret);
//            break;
//        case 2:
//            printf("输⼊操作数：");
//                scanf("%d %d", &x, &y);
//            ret = sub(x, y);
//            printf("ret = %d\n", ret);
//            break;
//        case 3:
//            printf("输⼊操作数  ");
//                scanf("%d %d", &x, &y);
//            ret = mul(x, y);
//            printf("ret = %d\n", ret);
//            break;
//        case 4:
//            printf("输⼊操作数");
//
//                scanf("%d %d", &x, &y);
//            ret = div(x, y);
//            printf("ret = %d\n", ret);
//            break;
//        case 0:
//            printf("退出程序 \n");
//                break;
//        default:
//            printf(" 选择错误 \n");
//                break;
//        }
//    } while (input);
//    return 0;
//}



//用了函数指针数组

int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int mul(int a, int b)
{
    return a * b;
}
int div(int a, int b)
{
    return a / b;
}
int main()
{
    int x, y;
    int input = 1;
    int ret = 0;
    int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表

        do
        {
            printf("*************************\n");
            printf("  1:add           2:sub  \n");
            printf("  3:mul           4:div  \n");
            printf("  0:exit                 \n");
            printf("*************************\n");
            printf(" 请选择： " );
                scanf("%d", &input);
            if ((input <= 4 && input >= 1))
            {
                printf("输⼊操作数：  " );
                    scanf("%d %d", &x, &y);
                ret = (*p[input])(x, y);
                printf("ret = %d\n", ret);
            }
            else if (input == 0)
            {
                printf("退出计算器 \n");
            }
            else
            {
                printf(" 输⼊有误 \n" );        
            }
        } while (input);
        return 0;
}

//可以看到，函数的代码简化了非常之多